import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpEchoServer {

    private DatagramSocket socket=null;
    public UdpEchoServer(int port) throws SocketException {
        //指定端口号
        socket=new DatagramSocket(port);
    }

    public void start() throws IOException {
        System.out.println("服务器启动");
        while(true){
            //处理请求,一般分为三步
            //1.读取请求并解析
            DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);//此处传入的字节数组,保存UDP的在和部分
            socket.receive(requestPacket);
            //把读取到的二进制数据转换成字符串
            String request=new String(requestPacket.getData(),0, requestPacket.getLength());
            //2.根据请求,计算响应
            String response=process(request);
            //3.把响应返回给客户端
            //根据response构造成DatagramPacket,发送给客户端
            //此处不能使用response.length()  因为这个是字符长度   response.getBytes().length这个是string字节的长度,两者不一致
            DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,
                    requestPacket.getSocketAddress());
            //此处还不能直接发送,UDP协议自身没有保存对方的信息(不知道发给谁)
            //需要指定目的ip跟目的端口
            requestPacket.getSocketAddress();

            socket.send(responsePacket);
            //4.打印日志
            System.out.printf("[%s:%d] req:%s,resp: %s\n",requestPacket.getAddress().toString(),requestPacket.getPort(),
                    request,response);
        }


    }

    //后续如果要写别的服务器,只修改这个地方就行了

    public String process(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        UdpEchoServer server=new UdpEchoServer(9090);
        server.start();
    }
}

